package com.niit.mall.common.domain.query;


import com.alibaba.csp.sentinel.util.StringUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.Objects;

/**
 * @BelongsProject: pardo_mall_backend
 * @BelongsPackage: com.niit.mall.admin.domain.query
 * @Author: ChuXuan
 * @CreateTime: 2025-05-23  17:34
 * @Description: 分页查询参数
 * @Version: 1.0
 */
@Data
@Slf4j
public class PageQuery {
	
	/**
	 * 页码
	 */
	private Long pageNum ;
	
	/**
	 * 每页显示的数量
	 */
	private Long pageSize ;
	
	/**
	 * 排序依据
	 */
	private String sortBy;
	
	/**
	 * 是否升序排列
	 */
	private Boolean isAsc = true;
	
	/**
	 * 将OrderItem数组转换为MP分页对象
	 *
	 * @param <T>   泛型参数，表示分页数据类型
	 * @param items 排序条件数组
	 * @return MP分页对象
	 */
	public <T> Page<T> toMpPage(OrderItem... items){
		if(pageNum == null){
			pageNum = 1L;
		}
		if (pageSize == null){
			pageSize = 10L;
		}


		// 分页条件
		Page<T> page = new Page<>(pageNum, pageSize);
		if (StringUtil.isNotBlank(sortBy)){
			page.addOrder(new OrderItem(sortBy,isAsc));
		}else if  (items != null){
			page.addOrder(items);
		}
		return page;
	}
	
	/**
	 * 根据更新时间生成默认的分页查询条件。
	 *
	 * @param <T> 泛型参数，表示分页数据类型
	 * @return 返回一个根据更新时间逆序排列的分页对象
	 */
	public <T> Page<T> toMpPageDefaultByUpdateDate(){
		return toMpPage(new OrderItem("update_date",false));
	}

	/**
	 * 将默认排序规则转换为MyBatis Plus分页对象。
	 *
	 * @param defaultSortBy 默认排序字段
	 * @param defaultIsAsc  默认排序方式，true表示升序，false表示降序
	 * @return 返回MyBatis Plus的分页对象
	 */
	public <T> Page<T> toMpPage(String defaultSortBy, Boolean defaultIsAsc){
		boolean isAsc = defaultIsAsc != null && defaultIsAsc;
		String sortBy = Objects.equals(defaultSortBy, "") ? "update_date" : defaultSortBy;
		return toMpPage(new OrderItem(sortBy, isAsc));
	}

}
